*&---------------------------------------------------------------------*
*& Report ZEX_LISTING_62                                               *
*&---------------------------------------------------------------------*
*& Created By: James Wood (james.wood@bowdarkconsulting.com)           *
*& Created On: 12/12/2008                                              *
*& Purpose:    This program shows a narrowing cast between a parent    *
*&             class and a subclass.                                   *
*&---------------------------------------------------------------------*
REPORT zex_listing_62.

*----------------------------------------------------------------------*
*       CLASS lcl_parent DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_parent DEFINITION.

  PUBLIC SECTION.
    METHODS: a,
             b.

ENDCLASS.                    "lcl_parent DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_parent IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_parent IMPLEMENTATION.

  METHOD a.
    WRITE: / 'In method a.'.
  ENDMETHOD.                    "a

  METHOD b.
    WRITE: / 'In method b.'.
  ENDMETHOD.                    "b

ENDCLASS.                    "lcl_parent IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_child  DEFINITIO
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_child DEFINITION
      INHERITING FROM lcl_parent.

  PUBLIC SECTION.
    METHODS: c.

ENDCLASS.                    "lcl_child  DEFINITIO

*----------------------------------------------------------------------*
*       CLASS lcl_child IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_child IMPLEMENTATION.

  METHOD c.
    WRITE: / 'In method c.'.
  ENDMETHOD.                    "c

ENDCLASS.                    "lcl_child IMPLEMENTATION

*----------------------------------------------------------------------*
* START-OF-SELECTION Event Module                                      *
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM test_cast.

*&---------------------------------------------------------------------*
*&      Form  test_cast
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM test_cast.

* Local Data Declarations:
  DATA: lr_parent TYPE REF TO lcl_parent,
            lr_child TYPE REF TO lcl_child.

* Create an instance of the parent and child objects:
  CREATE OBJECT lr_parent.
  CREATE OBJECT lr_child.

* Perform a narrowing cast:
  lr_parent = lr_child.

  CALL METHOD lr_parent->a.
  CALL METHOD lr_parent->b.

* Note that this statement will not pass a syntax check as method
* c is not defined in class lcl_parent. Thus, even though the object
* reference variable lr_parent points at an object of class lcl_child
* (where method c is defined), we cannot access it from lr_parent
* since the static type of lr_parent does not have a method c defined:
  "CALL METHOD lr_parent->c.

ENDFORM.                    "test_cast